// 最优方法，可以实现大多引用类型的深拷贝
// 基本实现常用类型的拷贝
const deepClone = <T>(target: T): T => {
    let result
    if (typeof target === 'object') {
        if (Array.isArray(target)) {
            result = []
            for (let i in target) {
                result.push(deepClone(target[i]))
            }
        } else if (target === null) {
            result = null
        } else {
            result = {}
            for (let i in target) {
                result[i] = deepClone(target[i])
            }
        }
    } else {
        result = target
    }
    return result
}

// #region
// let obj = {
//     a:1, b:2, c: {
//         d: 2
//     }
// }
// let obj2 = deepClone(obj)
// obj2.b = 3
// obj2.c.d = 5
// console.log(obj);
// console.log(obj2);

// let arr = [1, 2, 3, 4, [5,6]]
// arr2 = deepClone(arr)
// arr2[0] = 5
// arr2[4][0] = 7
// console.log(arr);
// console.log(arr2);

// let a = 3
// b = deepClone(a)
// b = 4
// console.log(a);
// console.log(b);

// let x = undefined
// let y = deepClone(x)
// y = 3
// console.log(x);
// console.log(y);

// let x = function() {}
// let y = deepClone(x)
// console.log(x);
// console.log(y);
// #endregion

const deepClone2 = <T>(target: T): T => {
    return JSON.parse(JSON.stringify(target))
}

// #region
// let a = 1
// let b =deepClone2(a)
// // b = 3
// console.log(a);
// console.log(b);

// let obj = {
//     a:1, b:2, c: {
//         d: 2
//     }
// }
// let obj2 = deepClone2(obj)
// obj2.b = 3
// obj2.c.d = 5
// console.log(obj);
// console.log(obj2);

// 拷贝undefined时会报错
// let x = undefined
// let y = deepClone2(x)
// // y = 3
// console.log(x);
// console.log(y);

// let arr = [1, 2, 3, 4, [5,6]]
// arr2 = deepClone2(arr)
// arr2[0] = 5
// arr2[4][0] = 7
// console.log(arr);
// console.log(arr2);

// let x = null
// let y =deepClone2(x)
// y = 2
// console.log(x);
// console.log(y);

// 拷贝函数会报错
// let x = function() {}
// let y = deepClone2(x)
// console.log(x);
// console.log(y);
// #endregion

export { }